Sequential programs execute each individual task of the program in sequential order. However, many current computers and computing devices include multi-core technology and are capable of executing multiple tasks of a program in parallel. As such, in order to maximize benefit of the multi-core technology, sequential programs may be parallelized. To do so, the sequential program is reconfigured such that various tasks are executed in parallel with each other. However, parallel programs are more difficult to debug and validate than sequential programs. For example, depending on data dependencies between the tasks, race conditions and/or other non-deterministic conditions can occur if two or more tasks that are executed in parallel attempt to access the same memory location. As such, the parallelism of the various tasks to be executed in parallel must be analyzed.
The various tasks of the sequential program correlate to a set of instructions that may or may not be executed in parallel with one or more other tasks. The program may begin with a root task, which spawns (i.e., initiates) other tasks. Each task may spawn no additional task, one additional task, or multiple additional tasks. A task that spawns another task is typically referred to as the parent task of the spawned task, which is known as a child task. Two tasks with the same parent task are typically referred to as sibling tasks.